package com.legendframework.core.dao.annotation;

import com.legendframework.core.dao.enums.DataType;
import com.legendframework.core.dao.yaml.enums.YamlStorageType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 实体类信息注解
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {

    /**
     * 实体类存储类型
     * 定义后,该类只按照该值定义的类型来存储
     *
     * DataType.UNDEFINED 用于说明现目前不确定该实体类的存储类型，确切的存储类型由配置文件动态定义
     * 如果在@Entity.type()中提前定义了数据存储类型例如:DataType.MYSQL ，则该实体类会无视外部配置文件的动态配置
     * 每次始终使用实体类@Entity.type()中定义的存储方式
     * @return
     */
    DataType type() default DataType.UNDEFINED;

    /**
     * SQL表名
     * 如果不指定，默认为本类类名驼峰转下划线，
     * 例如：UserTable -> user_table
     * @return
     */
    String sqlTableName() default "";

    /**
     * yaml文件相对路径
     * 如果 {@link Entity#yamlStorageType()} 取值为: YamlStorageType.MANY_TO_ONE
     * 则该值应该返回一个目录(文件夹)名称,如果为其他，这个值应该为一个".yml" 后缀的文件名称，但是".yml"后缀可以不用填写
     *
     * @return
     */
    String yamlFileName();

    /**
     * Yaml文件的存储类型
     *
     * 单个文件存储
     * 一个对象代表一个Yaml文件
     * ONE_TO_ONE
     *
     * 单个文件存储
     * 一个文件存储一个集合对象
     * ONE_TO_MANY
     *
     * 多个文件存储
     * 多个文件存储，每个文件存储一个对象
     * 指定目录下的所有文件，包括递归层级的文件都会读取
     * MANY_TO_ONE,
     *
     * @return
     */
    YamlStorageType yamlStorageType();
}
